| Conditions | 1 |
| Paths | 576 |
| Total Lines | 243 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | /** |
||
| 58 | objects.each(function collapsible(index) { |
||
| 59 | var object = $(this), |
||
| 60 | storage = settings.storage + '.' + index + '.collapsed'; |
||
| 61 | |||
| 62 | var getDuration = function (duration) { |
||
| 63 | return $.isNumeric(duration) ? duration : settings.delay; |
||
| 64 | }; |
||
| 65 | |||
| 66 | /*--------------------------------------------------------------------- |
||
| 67 | Events |
||
| 68 | ---------------------------------------------------------------------*/ |
||
| 69 | |||
| 70 | var collapseItem = function collapse(item, duration) { |
||
| 71 | var heightMin = 0; |
||
| 72 | |||
| 73 | // Customization point |
||
| 74 | item.trigger('collapsebefore.collapsible', settings); |
||
| 75 | |||
| 76 | heightMin = item.data('heightMin'); |
||
| 77 | |||
| 78 | // Check duration |
||
| 79 | if(duration !== 0) { |
||
| 80 | item.addClass('js-animate'); |
||
| 81 | item.trigger('collapsestart.collapsible'); |
||
| 82 | } |
||
| 83 | |||
| 84 | // Collapse item |
||
| 85 | item.addClass('collapsed'); |
||
| 86 | item.css('max-height', heightMin); |
||
| 87 | |||
| 88 | if(duration !== 0) { |
||
| 89 | setTimeout(function() { |
||
| 90 | item.trigger('animationend.collapsible'); |
||
| 91 | item.trigger('animationend.duplicator'); |
||
| 92 | }, duration); |
||
| 93 | } |
||
| 94 | }; |
||
| 95 | |||
| 96 | // Collapse item |
||
| 97 | object.on('collapse.collapsible', settings.items, function collapse(event, duration) { |
||
| 98 | var item = $(this); |
||
| 99 | collapseItem(item, getDuration(duration)); |
||
| 100 | }); |
||
| 101 | |||
| 102 | // Collapse all items |
||
| 103 | object.on('collapseall.collapsible', function collapseAll(event) { |
||
|
|
|||
| 104 | var items = object.find(settings.items + ':not(.collapsed)'), |
||
| 105 | visibles = Symphony.Utilities.inSight(items), |
||
| 106 | invisibles = $(), |
||
| 107 | scrollTop = $(window).scrollTop(), |
||
| 108 | visibleIndex = visibles.eq(0).index(), |
||
| 109 | visibleCollapsedHeight = 0; |
||
| 110 | |||
| 111 | // Find items that will be visible after collapse |
||
| 112 | while (visibleIndex < items.length && visibleCollapsedHeight < window.innerHeight) { |
||
| 113 | var currentItem = items.eq(visibleIndex); |
||
| 114 | visibles = visibles.add(currentItem); |
||
| 115 | visibleCollapsedHeight += currentItem.data('heightMin'); |
||
| 116 | visibleIndex++; |
||
| 117 | } |
||
| 118 | visibles.each(function () { collapseItem($(this), settings.delay); }); |
||
| 119 | |||
| 120 | setTimeout(function collapseAllInvisibleEnd() { |
||
| 121 | var first = visibles.eq(0); |
||
| 122 | var firstOffset = !first.length ? 0 : first.offset().top; |
||
| 123 | // update invisible accordingly |
||
| 124 | invisibles = items.not(visibles); |
||
| 125 | invisibles.each(function () { collapseItem($(this), 0); }); |
||
| 126 | if (firstOffset > 0 && scrollTop > object.offset().top) { |
||
| 127 | // scroll back to where we were, |
||
| 128 | // which is last scroll position + delta of first visible item |
||
| 129 | $(window).scrollTop(scrollTop + (first.offset().top - firstOffset)); |
||
| 130 | } |
||
| 131 | invisibles.trigger('animationend.collapsible'); |
||
| 132 | }, settings.delay + 100); |
||
| 133 | }); |
||
| 134 | |||
| 135 | // Expand item |
||
| 136 | var expandItem = function (item, duration) { |
||
| 137 | var heightMax = 0; |
||
| 138 | |||
| 139 | // Customization point |
||
| 140 | item.trigger('expandbefore.collapsible', settings); |
||
| 141 | |||
| 142 | heightMax = item.data('heightMax'); |
||
| 143 | |||
| 144 | // Check duration |
||
| 145 | if(duration !== 0) { |
||
| 146 | item.addClass('js-animate'); |
||
| 147 | item.trigger('expandstart.collapsible'); |
||
| 148 | } |
||
| 149 | |||
| 150 | // Collapse item |
||
| 151 | item.removeClass('collapsed'); |
||
| 152 | item.css('max-height', heightMax); |
||
| 153 | |||
| 154 | if(duration !== 0) { |
||
| 155 | setTimeout(function() { |
||
| 156 | item.trigger('animationend.collapsible'); |
||
| 157 | }, duration); |
||
| 158 | } |
||
| 159 | }; |
||
| 160 | |||
| 161 | object.on('expand.collapsible', settings.items, function expand(event, duration) { |
||
| 162 | var item = $(this); |
||
| 163 | expandItem(item, getDuration(duration)); |
||
| 164 | }); |
||
| 165 | |||
| 166 | // Expand all items |
||
| 167 | object.on('expandall.collapsible', function expandAll(event) { |
||
| 168 | var items = object.find(settings.items + '.collapsed'), |
||
| 169 | visibles = Symphony.Utilities.inSight(items).filter('*:lt(4)'), |
||
| 170 | invisibles = items.not(visibles), |
||
| 171 | scrollTop = $(window).scrollTop(); |
||
| 172 | |||
| 173 | visibles.addClass('js-animate-all'); // prevent focus |
||
| 174 | visibles.each(function () { expandItem($(this), settings.delay); }); |
||
| 175 | setTimeout(function expandAllInvisible() { |
||
| 176 | var first = visibles.eq(0); |
||
| 177 | var firstOffset = !first.length ? 0 : first.offset().top; |
||
| 178 | invisibles.addClass('js-animate-all'); // prevent focus |
||
| 179 | invisibles.each(function () { expandItem($(this), 0); }); |
||
| 180 | invisibles.trigger('animationend.collapsible'); |
||
| 181 | // if we are past the first item |
||
| 182 | if (firstOffset > 0 && scrollTop > object.offset().top) { |
||
| 183 | // scroll back to where we were, |
||
| 184 | // which is last scroll position + delta of first visible item |
||
| 185 | $(window).scrollTop(scrollTop + (first.offset().top - firstOffset)); |
||
| 186 | } |
||
| 187 | }, settings.delay + 100); |
||
| 188 | }); |
||
| 189 | |||
| 190 | // Finish animations |
||
| 191 | object.on('animationend.collapsible', settings.items, function finish(event) { |
||
| 192 | var item = $(this); |
||
| 193 | |||
| 194 | // Trigger events |
||
| 195 | if(item.is('.collapsed')) { |
||
| 196 | item.trigger('collapsestop.collapsible'); |
||
| 197 | } |
||
| 198 | else { |
||
| 199 | item.trigger('expandstop.collapsible'); |
||
| 200 | } |
||
| 201 | |||
| 202 | // clean up |
||
| 203 | item.removeClass('js-animate js-animate-all'); |
||
| 204 | }); |
||
| 205 | |||
| 206 | // Toggle single item |
||
| 207 | object.on('click.collapsible', settings.handles, function toggle(event) { |
||
| 208 | var handle = $(this), |
||
| 209 | item = handle.closest(settings.items); |
||
| 210 | |||
| 211 | if(!handle.is(settings.ignore) && !$(event.target).is(settings.ignore) && !item.is('.locked')) { |
||
| 212 | |||
| 213 | // Expand |
||
| 214 | if(item.is('.collapsed')) { |
||
| 215 | expandItem(item, settings.delay); |
||
| 216 | } |
||
| 217 | |||
| 218 | // Collapse |
||
| 219 | else { |
||
| 220 | collapseItem(item, settings.delay); |
||
| 221 | } |
||
| 222 | } |
||
| 223 | }); |
||
| 224 | |||
| 225 | // Save states |
||
| 226 | var saveTimer = 0; |
||
| 227 | object.on('collapsestop.collapsible expandstop.collapsible store.collapsible', settings.items, function saveState(event) { |
||
| 228 | if(settings.save_state === true && Symphony.Support.localStorage === true) { |
||
| 229 | // save it to local storage, delayed, once |
||
| 230 | clearTimeout(saveTimer); |
||
| 231 | saveTimer = setTimeout(function () { |
||
| 232 | var collapsed = object.find(settings.items).map(function(index) { |
||
| 233 | if($(this).is('.collapsed')) { |
||
| 234 | return index; |
||
| 235 | }; |
||
| 236 | }).get().join(','); |
||
| 237 | |||
| 238 | save(storage, collapsed); |
||
| 239 | }, settings.delay); |
||
| 240 | } |
||
| 241 | }); |
||
| 242 | |||
| 243 | // Restore states |
||
| 244 | object.on('restore.collapsible', function restoreState(event) { |
||
| 245 | if(settings.save_state === true && Symphony.Support.localStorage === true && window.localStorage[storage]) { |
||
| 246 | $.each(window.localStorage[storage].split(','), function(index, value) { |
||
| 247 | var collapsed = object.find(settings.items).eq(value); |
||
| 248 | if(collapsed.has('.invalid').length == 0) { |
||
| 249 | collapseItem(collapsed, 0); |
||
| 250 | } |
||
| 251 | }); |
||
| 252 | } |
||
| 253 | }); |
||
| 254 | |||
| 255 | // Refresh state storage after ordering |
||
| 256 | object.on('orderstop.orderable', function refreshOrderedState(event) { |
||
| 257 | object.find(settings.items).trigger('store.collapsible'); |
||
| 258 | }); |
||
| 259 | |||
| 260 | // Refresh state storage after deleting and instance |
||
| 261 | object.on('destructstop.duplicator', settings.items, function refreshState() { |
||
| 262 | $(this).trigger('store.collapsible'); |
||
| 263 | }); |
||
| 264 | |||
| 265 | // Update sizes |
||
| 266 | object.on('updatesize.collapsible', settings.items, function updateSizes() { |
||
| 267 | var item = $(this), |
||
| 268 | min = item.find(settings.handles).outerHeight(true), |
||
| 269 | max = min + item.find(settings.content).outerHeight(true); |
||
| 270 | |||
| 271 | item.data('heightMin', min); |
||
| 272 | item.data('heightMax', max); |
||
| 273 | }); |
||
| 274 | |||
| 275 | // Set sizes |
||
| 276 | object.on('setsize.collapsible', settings.items, function setSizes() { |
||
| 277 | var item = $(this); |
||
| 278 | var heightMin = item.data('heightMin'); |
||
| 279 | var heightMax = item.data('heightMax'); |
||
| 280 | item.css({ |
||
| 281 | 'min-height': heightMin, |
||
| 282 | 'max-height': heightMax |
||
| 283 | }); |
||
| 284 | }); |
||
| 285 | |||
| 286 | /*--------------------------------------------------------------------- |
||
| 287 | Initialisation |
||
| 288 | ---------------------------------------------------------------------*/ |
||
| 289 | |||
| 290 | // Prepare interface |
||
| 291 | object.addClass('collapsible').find(settings.items).each(function() { |
||
| 292 | var item = $(this); |
||
| 293 | item.addClass('instance'); |
||
| 294 | item.trigger('updatesize.collapsible'); |
||
| 295 | item.trigger('setsize.collapsible'); |
||
| 296 | }); |
||
| 297 | |||
| 298 | // Restore states |
||
| 299 | object.trigger('restore.collapsible'); |
||
| 300 | }); |
||
| 301 | |||
| 308 |
This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.